#ifndef DATA_H
#define DATA_H

#include <QString>
#include <QIcon>
#include <QDateTime>
#include <QFile>
#include <QIcon>
#include <QPixmap>
#include <QUuid>
#include <QTime>

#include "Logger.h"

namespace model
{
// ------------------------------------------------------------ //
// ------------------------- 工具函数 ------------------------- //
// ------------------------------------------------------------ //
class Func
{
public:
    // 将时间戳格式化
    static inline QString formatTime(int64_t timestamp)
    {
        // 转换为QDateTime对象
        QDateTime dateTime = QDateTime::fromSecsSinceEpoch(timestamp);
        // 转为格式化时间
        return dateTime.toString("MM-dd HH:mm:ss");
    }

    // 获取 秒级 时间
    static inline int64_t getTime(){
        return QDateTime::currentSecsSinceEpoch();
    }

    // 将 QByteArray 转为QIcon
    static inline QIcon makeIcon(const QByteArray& data)
    {
        QPixmap pixmap;
        pixmap.loadFromData(data);
        QIcon icon(pixmap);
        return icon;
    }

    // 从文件中读取二进制内容
    static inline QByteArray readFileToByteArray(const QString& path)
    {
        QFile file(path);
        bool ret = file.open(QFile::ReadOnly);
        if(!ret) {
            LOG_ERROR() << "文件打开失败: " << path;
            return QByteArray();
        }

        QByteArray content = file.readAll();
        file.close();
        return content;
    }

    // 将 QByteArray 的内容写入文件
    static inline void writeByteArrayToFile(const QString& path, const QByteArray& content)
    {
        QFile file(path);
        bool ret = file.open(QFile::WriteOnly);
        if(!ret) {
            LOG_ERROR() << "打开文件失败: " << path;
            return;
        }
        file.write(content);
        file.flush();
        file.close();
    }
};

// ------------------------------------------------------------ //
// ------------------------- 用户信息 ------------------------- //
// ------------------------------------------------------------ //
class UserInfo
{
public:
    QString userId = "";			// 用户编号
    QString nickname = "";			// 用户昵称
    QString description = ""; 		// 用户签名
    QString phone = "";				// 手机号码
    QIcon avatar;					// 用户头像

public:

};

// ------------------------------------------------------------ //
// ------------------------- 消息类型 ------------------------- //
// ------------------------------------------------------------ //
enum MessageType {
    TEXT_TYPE,		// 文本消息
    IMAGE_TYPE, 	// 图片消息
    FILE_TYPE, 		// 文件消息
    SPECCH_TYPE 	// 语音消息
};

// ------------------------------------------------------------ //
// ------------------------- 消息 ------------------------- //
// ------------------------------------------------------------ //
class Message {
public:
    QString messageId = "";				// 消息的编号
    QString chatSessionId = "";			// 消息所属会话的编号
    QString time = "";					// 消息的时间. 【10-12 12:00:00】
    MessageType messageType = TEXT_TYPE;// 消息类型
    UserInfo sender;					// 发送者的信息
    QByteArray content;					// 消息的正文内容
    QString fileId = "";				// 文件的身份标识. 仅当消息为文件类型时，有效，否则为""
    QString fileName = ""; 				// 文件名称. 只是当消息类型为 文件 消息, 才有效. 否则为""

    // 创建一个信息类型
    static Message makeMessage(MessageType messageType, const QString& sessionId, const UserInfo& sender,
                               const QByteArray& content, const QString& extraInfo)
    {
        if(messageType == TEXT_TYPE) {
            return makeTextMessage(sessionId, sender, content);
        } else if (messageType == IMAGE_TYPE) {
            return makeImageMessage(sessionId, sender, content);
        } else if (messageType == SPECCH_TYPE) {
            return makeSpecchMessage(sessionId, sender, content);
        } else if (messageType == FILE_TYPE) {
            return makeFileMessage(sessionId, sender, content, extraInfo);
        } else {
            LOG_ERROR() << "未知的消息类型";
            return Message();
        }
    }

private:
    static QString makeId()
    {
        return "M" + QUuid::createUuid().toString().slice(25, 12); // slice 切割，只要部分id信息
    }

    static Message makeTextMessage(const QString& sessionId, const UserInfo& sender, const QByteArray& content)
    {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = sessionId;
        message.content = content;
        message.sender = sender;
        message.time = Func::formatTime(Func::getTime());
        message.messageType = TEXT_TYPE;

        // 文本消息不需要文件相关属性
        message.fileId = "";
        message.fileName = "";

        return message;
    }

    static Message makeImageMessage(const QString& sessionId, const UserInfo& sender, const QByteArray& content)
    {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = sessionId;
        message.content = content;
        message.sender = sender;
        message.time = Func::formatTime(Func::getTime());
        message.messageType = IMAGE_TYPE;

        message.fileId = "";
        message.fileName = "";

        return message;
    }

    static Message makeFileMessage(const QString& sessionId, const UserInfo& sender, const QByteArray& content, const QString& fileName)
    {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = sessionId;
        message.content = content;
        message.sender = sender;
        message.time = Func::formatTime(Func::getTime());
        message.messageType = FILE_TYPE;

        // 文本消息不需要文件相关属性
        message.fileId = "";
        message.fileName = fileName;

        return message;
    }

    static Message makeSpecchMessage(const QString& sessionId, const UserInfo& sender, const QByteArray& content)
    {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = sessionId;
        message.content = content;
        message.sender = sender;
        message.time = Func::formatTime(Func::getTime());
        message.messageType = SPECCH_TYPE;

        message.fileId = "";
        message.fileName = "";

        return message;
    }
};

// ------------------------------------------------------------ //
// ------------------------- 会话信息 ------------------------- //
// ------------------------------------------------------------ //
class chatSessionInfo
{
public:
    QString chatSessionId = ""; // 会话编号
    QString chatSessionName = ""; // 会话名
    Message lastMessage; // 会话的最新消息
    QIcon avatar; // 会话图标，单人会话即用户头像，群组即多人
    QString userId = ""; // 用户编号
};

}

#endif // DATA_H
